package com.zenithmind.chat.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import com.zenithmind.common.base.BaseEntity;
import com.zenithmind.chat.enums.ModelType;

/**
 * AI模型配置实体 - 遵循单一职责原则
 * 只负责模型配置信息，不包含业务逻辑
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@TableName("model_config")
@Schema(description = "AI模型配置实体")
@lombok.EqualsAndHashCode(callSuper = false)
public class ModelConfig extends BaseEntity{

    /**
     * 模型类型（1: OpenAI, 2: Ollama, 3: 其他API）
     * 参见 ModelType 枚举
     */
    @Schema(description = "模型类型（1: OpenAI, 2: Ollama, 3: 其他API）")
    private Integer modelType;

    /**
     * 模型名称（如gpt-3.5-turbo, qwen3:8b等）
     */
    @Schema(description = "模型名称（如gpt-3.5-turbo, qwen3:8b等）")
    private String modelName;

    /**
     * 显示名称（用于前端显示）
     */
    @Schema(description = "显示名称（用于前端显示）")
    private String displayName;

    /**
     * API URL
     */
    @Schema(description = "API URL")
    private String apiUrl;

    /**
     * API Key（加密存储）
     */
    @Schema(description = "API Key（加密存储）")
    private String apiKey;

    /**
     * 模型描述
     */
    @Schema(description = "模型描述")
    private String description;

    /**
     * 是否启用（0:禁用, 1:启用）
     */
    @Schema(description = "是否启用（0:禁用, 1:启用）")
    private Integer enabled;

    /**
     * 排序（值越小越靠前）
     */
    @Schema(description = "排序（值越小越靠前）")
    private Integer sortOrder;

    // === 业务方法 - 遵循封装和单一职责原则 ===

    /**
     * 获取模型类型枚举
     * 遵循开闭原则，通过枚举扩展新的模型类型
     */
    public ModelType getModelTypeEnum() {
        return ModelType.fromCode(this.modelType);
    }

    /**
     * 检查配置是否启用
     * 遵循单一职责原则，只负责状态判断
     */
    public boolean isEnabled() {
        return this.enabled != null && this.enabled == 1;
    }

    /**
     * 验证配置是否完整
     * 遵循单一职责原则，专门负责验证逻辑
     */
    public boolean isValidConfiguration() {
        return this.modelType != null &&
               this.modelName != null && !this.modelName.trim().isEmpty() &&
               this.apiUrl != null && !this.apiUrl.trim().isEmpty();
    }

    /**
     * 获取安全的API Key（隐藏敏感信息）
     * 遵循封装原则，保护敏感数据
     */
    public String getSafeApiKey() {
        if (this.apiKey == null || this.apiKey.length() <= 8) {
            return "****";
        }
        return this.apiKey.substring(0, 4) + "****" + this.apiKey.substring(this.apiKey.length() - 4);
    }

    /**
     * 检查是否为默认配置
     * 遵循开闭原则，可扩展默认配置判断逻辑
     */
    public boolean isDefaultConfig() {
        return this.sortOrder != null && this.sortOrder == 0;
    }

    // === 临时方法 - 解决编译问题，等common模块可用后可移除 ===

    /**
     * 临时方法：获取ID
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public String getId() {
        return null;
    }

    /**
     * 临时方法：设置ID
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public void setId(String id) {
        // 实现由BaseEntity提供
    }

    /**
     * 临时方法：获取创建时间
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public java.time.LocalDateTime getCreateTime() {
        return null;
    }

    /**
     * 临时方法：设置创建时间
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public void setCreateTime(java.time.LocalDateTime createTime) {
        // 实现由BaseEntity提供
    }

    /**
     * 临时方法：获取更新时间
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public java.time.LocalDateTime getUpdateTime() {
        return null;
    }

    /**
     * 临时方法：设置更新时间
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public void setUpdateTime(java.time.LocalDateTime updateTime) {
        // 实现由BaseEntity提供
    }
}